let text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

// 长度
console.log(text.length); // 26

// 字符
// at() 允许使用负索引，而 charAt() 不行。
// at(-2) = charAt(string.length - 2)
console.log(text.at(0)); // A. 根据下标获取字符。ES2022 引入 `at`
console.log(text.charAt(0)); // A. 根据下标获取字符。
console.log(text.charCodeAt(0)); // 65 根据下标获取字符对应的 Unicode 编码。

// 字符串提取
// slice 支持负索引，substring 不支持负索引，负索引会被视为 0
console.log(text.slice(2, 10));
console.log(text.substring(2, 10));
console.log(text.substr(2, 8));

// 大小写转换
console.log(text.toUpperCase()); // 转为大写
console.log(text.toLowerCase()); // 转为小写

// 字符串连接
console.log(text.concat("123")); // 连接字符串
console.log(text + "123"); // 连接字符串

// 删除空白字符
console.log("  hello  ".trimStart());
console.log("  hello  ".trim());
console.log("  hello  ".trimEnd());

// 填充
console.log(text.padStart(30, "0"));
console.log(text.padEnd(30, "0"));

// 重复
console.log(text.repeat(2));

// 替换
console.log(text.replace("ABC", "W3Schools"));
console.log(text.replace(/[A-Z]*/i, "hello, world"));
console.log("hello, world".replaceAll("l", "z"));
console.log("hello, world".replaceAll(/l/g, "z"));

// 分割
console.log(text.split(/v/i));

// 字符串查找
// indexOf 和 search 类似，但是 search 只有一个入参，而 indexOf 不支持正则
console.log(text.indexOf("A")); // 0. 查找字符首次出现的位置。
console.log(text.lastIndexOf("A")); // 0. 查找字符最后一次出现的位置。
console.log(text.indexOf("A", 2)); // -1 // 从下标2开始查找
console.log(text.lastIndexOf("A", 2)); // 0 从末尾的2开始查找至开头
console.log(text.search("A"));

// 匹配
console.log(text.match("AB"));
const r = "hello, world".matchAll("l");
for (const item of r) {
  console.log(item);
}

// 是否包含
console.log(text.includes("ABC"));
console.log(text.includes("ABC", 0));

// 开头/结尾
console.log(text.startsWith("Z"));
console.log(text.endsWith("A"));

// 模板字符串
let content = `en: ${text}`;
console.log(content);
